package com.ktjy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ktjy.dto.MenuDTO;
import com.ktjy.mapper.SysMenuMapper;
import com.ktjy.pojo.SysMenu;
import com.ktjy.pojo.SysRole;
import com.ktjy.pojo.SysUser;
import com.ktjy.service.ISysMenuService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * <p>
 * 菜单权限表 服务实现类
 * </p>
 *
 * @author jjx
 * @since 2025-07-31
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
    @Override
    public List<SysMenu> findList(MenuDTO menuDTO) {
        //查询数据
        QueryWrapper<SysMenu> qw=new QueryWrapper<>();
        if(menuDTO.getMenuName()!=null && !menuDTO.getMenuName().isEmpty()){
            qw.like("menu_name",menuDTO.getMenuName());
        }
        if(menuDTO.getStatus()!=null && !menuDTO.getStatus().isEmpty()){
            qw.eq("status",menuDTO.getStatus());
        }
        return list(qw);
    }

    /**
     * 构建树形结构
     * @param nodes 所有节点的扁平列表
     * @param rootParentId 根节点的父ID，通常为0或null
     * @return 构建好的树形结构列表（根节点集合）
     */
    public List<SysMenu> buildTree(List<SysMenu> nodes, Long rootParentId) {
        // 1. 创建节点ID到节点对象的映射，提高查询效率
        Map<Long, SysMenu> nodeMap = new HashMap<>();
        for (SysMenu node : nodes) {
            nodeMap.put(node.getMenuId(), node);
        }

        // 2. 构建树形结构
        List<SysMenu> rootNodes = new ArrayList<>();

        for (SysMenu node : nodes) {
            Long parentId = node.getParentId();

            // 如果是根节点，直接加入根节点列表
            if (rootParentId.equals(parentId)) {
                rootNodes.add(node);
            } else {
                // 找到父节点并添加为子节点
                SysMenu parentNode = nodeMap.get(parentId);
                if (parentNode != null) {
                    parentNode.getChildren().add(node);
                }
            }
        }
        return rootNodes;
    }
}
